#include "Head.h"

// 初始化链表
User_Head_Node *Init_List()
{
    User_Head_Node *Head = NULL;

    // 创建动态空间
    Head = (User_Head_Node *)malloc(sizeof(User_Head_Node));

    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("链表创建失败!");
        return NULL;
    }

    Head->next = NULL;

    return Head;
}

// 销毁链表
void Free_List(User_Head_Node **Head)
{
    // 安全判断
    if (*Head == NULL)
    {
        ERRLOG("链表为NULL");
        return;
    }
    if ((*Head)->next == NULL)
    {
        ERRLOG("链表为空");
        (*Head)->next = NULL;
        free(*Head);
        return;
    }

    User_Node *ptr_1 = (*Head)->next;
    User_Node *ptr_2 = ptr_1->next;

    // 销毁节点
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        // 销毁顺序表 (航班信息)
        Free_Sql_list(&(ptr_1->data.Order));

        // 销毁链表节点
        free(ptr_1);

        ptr_1 = ptr_2;
        if (ptr_2 != NULL) // 当ptr_2为 NULL 时 ptr_2不往下跳了 在跳会越界
        {
            ptr_2 = ptr_2->next;
        }
    }

    // 销毁头节点
    (*Head)->next = NULL;
    free(*Head);
}

// 插入
void Insert_List(User_Head_Node *Head, User_data data_U, int pos)
{
    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("链表为NULL");
        return;
    }

    // 创建动态内存
    User_Node *New_Nod = (User_Node *)malloc(sizeof(User_Node));

    // 指针指向 第一个节点
    User_Node *ptr = Head->next;

    // 分配数据 用户信息
    New_Nod->next = NULL;
    New_Nod->data = data_U;

    // 初始化顺序表
    New_Nod->data.Order = Init_Sql_list();

    // 头插
    if (pos == 1)
    {
        New_Nod->next = Head->next;
        Head->next = New_Nod;

        return;
    }

    // 中间插 / 尾插
    {
        for (size_t i = 1; i < pos - 1 && ptr != NULL; i++) // ptr指向第pos的前一个节点
        {
            ptr = ptr->next;
        }

        New_Nod->next = ptr->next;
        ptr->next = New_Nod;
    }
}

// 删除
void Del_List(User_Head_Node *Head, int pos)
{
    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("链表为NULL");
        return;
    }
    if (Head->next == NULL)
    {
        ERRLOG("链表为空");
        return;
    }
    User_Node *ptr_1 = Head->next;
    User_Node *ptr_2 = NULL; // 储存要删节点的地址
    // 删头
    if (pos == 1)
    {
        Head->next = ptr_1->next;
        free(ptr_1); // 存放第一个节点的地址 方便销毁
        return;
    }

    // 删除 中间 / 尾 节点
    for (size_t i = 1; i < pos - 1 && ptr_1 != NULL; i++) // ptr_1指向要删除节点的前一个节点
    {
        ptr_1 = ptr_1->next;
    }

    ptr_2 = ptr_1->next;
    ptr_1->next = ptr_2->next;
    free(ptr_2);
}

// 遍历
void Printf_List(User_Head_Node *Head)
{
    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("链表为NULL");
        return;
    }
    if (Head->next == NULL)
    {
        ERRLOG("啥也没有,遍历个集贸");
        return;
    }

    User_Node *ptr = Head->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        printf("账户:%s\t密码:%s\t余额:%d\t账号等级:%s\n",
               ptr->data.user, ptr->data.pas, ptr->data.balance, ptr->data.Account_level);
        printf("您的航班订单:\n");
        Printf_Sql_list(ptr->data.Order);
        putchar('\n');
        ptr = ptr->next;
    }
}

// 名字查找 返回 账户地址
User_Node *Find_By_Name(User_Head_Node *Head, char *user)
{
    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("链表为NULL");
        return NULL;
    }
    if (Head->next == NULL)
    {
        ERRLOG("啥也没有,找个集贸");
        return NULL;
    }

    User_Node *ptr = Head->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        if (!strcmp(ptr->data.user, user))
        {
            return ptr;
        }
        ptr = ptr->next;
    }
    // printf("该账号信息不存在\n");
    return NULL;
}

// 合表
User_Head_Node *Merge_List(User_Head_Node *Head_1, User_Head_Node *Head_2)
{
    if (Head_1 == NULL || Head_2 == NULL)
    {
        printf("链表不存在\n");
        return Head_1;
    }
    // 1、求链表list1 的链表长度
    User_Node *ptr_1 = Head_1->next;
    int len = 0;

    while (ptr_1 != NULL)
    {
        ptr_1 = ptr_1->next;
        len++;
    }
    // 插入到链表中
    User_Node *ptr_2 = Head_2->next;
    while (ptr_2 != NULL)
    {
        len++;
        Insert_List(Head_1, ptr_2->data, len);

        if (ptr_1 == NULL)
        {
            for (size_t i = 0; i < len; i++)
            {
                if (i == 0)
                {
                    ptr_1 = Head_1->next;
                }
                else
                {
                    ptr_1 = ptr_1->next;
                }
            }
        }
        else
        {
            ptr_1 = ptr_1->next;
        }
        for (size_t i = 0; i < ptr_2->data.Order->len; i++)
        {
            Insert_Sql_list(ptr_1->data.Order, ptr_2->data.Order->Order_Data[i]);
        }
        ptr_2 = ptr_2->next;
    }

    return Head_1;
}

// 清空
void Empty_List(User_Head_Node *Head)
{
    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("链表为NULL");
        return;
    }
    if (Head->next == NULL)
    {
        // ERRLOG("链表为空");
        return;
    }

    User_Node *ptr_1 = Head->next;
    User_Node *ptr_2 = ptr_1->next;

    // 销毁节点
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        // 清空顺序表
        Empty_Sql_list(ptr_1->data.Order);

        free(ptr_1);
        ptr_1 = ptr_2;
        if (ptr_2 != NULL) // 当ptr_2为 NULL 时 ptr_2不往下跳了 在跳会越界
        {
            ptr_2 = ptr_2->next;
        }
    }
    Head->next = NULL;
}
